//$Id: BaseService Dec 26, 2009 10:02:05 PM encoding UTF-8 $ QQ:199742236 $ 
package com.hd.base.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.LockMode;
import org.hibernate.type.Type;
import org.springframework.dao.DataAccessException;

/**
 * 
 * @author saintwe
 *
 * @version 1.0 $ Dec 26, 2009 $ 10:02:11 PM $
 *
 */
public interface BaseService {
	
	/**
	 * 保存一个对象
	 * 
	 * @param entityName
	 * 			要保存对象的完全限定名
	 * @param entity
	 * 			要保存的对象
	 * @return
	 * 			是否保存成功
	 * 
	 * @throws DataAccessException
	 */
	public boolean save(String entityName, Object entity) throws DataAccessException; 
	
	/**
	 * 保存一个对象
	 * 
	 * @param entity
	 * 			要保存的对象
	 * @return
	 * 			是否保存成功
	 * 
	 * @throws DataAccessException
	 */
	public boolean save(Object entity) throws DataAccessException;
	
	/**
	 * 保存一个对象
	 * @param clazz
	 * 			该对象的Class对象
	 * @param entity
	 * 			要保存的对象
	 * @return
	 * 			是否成功
	 * 
	 * @throws DataAccessException
	 */
	public boolean save(Class clazz , Object entity) throws DataAccessException;
	
	/**
	 * 保存一个对象, 该方法与save方法的区别是: 假设Hibernate有一个saveWithGeneratorId()方法,
	 * 该方法负责向数据库插入数据 在不开启事务的情况下: save方法会去调用该方法, 进行对象的保存, 然后由数据库进行回滚
	 * persist()方法则不会去调用该方法
	 * 
	 * @param entityName
	 * 			要保存对象的全限定名
	 * @param enetity
	 * 			要保存的对象
	 * @return
	 * 			是否成功
	 * 
	 * @throws DataAccessException
	 */
	public boolean persist(String entityName , Object entity) throws DataAccessException;
	
	/**
	 * 保存一个对象
	 * 	
	 * @param enetity
	 * 		要保存的对象
	 * @return
	 * 		是否成功
	 * @throws DataAccessException
	 */
	public boolean persist(Object entity) throws DataAccessException;
	
	/**
	 * 保存一个对象
	 * 
	 * @param clazz
	 * 			该对象的Class对象
	 * @param enetity
	 * 			要保存的对象
	 * @return
	 * 			是否成功
	 * 
	 * @throws DataAccessException
	 */
	public boolean persist(Class clazz ,Object entity) throws DataAccessException;
	
	/**
	 * 保存或更新一个对象
	 * 
	 * @param entityName
	 * 			该对象的完全限定名
	 * @param entity
	 * 			保存或更新的对象
	 * @return
	 * 			是否保存或更新成功
	 * @throws DataAccessException
	 */
	public boolean saveOrUpdate(String entityName , Object entity) throws DataAccessException;
	
	/**
	 * 保存或更新一个对象
	 * 
	 * @param clazz
	 * 			该对象的类名
	 * @param entity
	 * 			保存或更新的对象
	 * @return
	 * 			是否保存或更新成功
	 * @throws DataAccessException
	 */
	public boolean saveOrUpdate(Class clazz , Object entity) throws DataAccessException;
	
	/**
	 * 保存或更新一个对象
	 * 
	 * @param entity
	 * 			保存或更新的对象
	 * @return
	 * 			是否保存或更新成功
	 * @throws DataAccessException
	 */
	public boolean saveOrUpdate(Object entity) throws DataAccessException;
	
	/**
	 * 更新一个对象
	 * 
	 * @param entityName
	 * 			更新对象的完全限定名
	 * @param entity
	 * 			更新的对象
	 * @return
	 * 			是否更新成功
	 * @throws DataAccessException
	 */
	public boolean update(String entityName , Object entity) throws DataAccessException;
	
	/**
	 * 更新一个对象
	 * 
	 * @param entity
	 * 			更新的对象
	 * @return
	 * 			是否更新成功
	 * @throws DataAccessException
	 */
	public boolean update(Object entity) throws DataAccessException;
	
	/**
	 * 更新一个对象
	 * 
	 * @param clazz
	 * 			更新该对象的Class对象
	 * @param entity
	 * 			更新的对象
	 * @return
	 * 			是否更新成功
	 * @throws DataAccessException
	 */
	public boolean update(Class clazz , Object entity) throws DataAccessException;
	
	/**
	 * 删除一个对象
	 * 
	 * @param entityName
	 * 			要删除对象的完全限定名
	 * @param entity
	 * 			要删除的对象
	 * @return
	 * 			是否删除成功
	 * @throws DataAccessException
	 */
	public boolean delete(String entityName , Object entity) throws DataAccessException;
	
	/**
	 * 删除一个对象
	 * 
	 * @param clazz
	 * 			要删除该对象的Class对象
	 * @param entity
	 * 			要删除的对象
	 * @return
	 * 			是否删除成功
	 * @throws DataAccessException
	 */
	public boolean delete(Class clazz , Object entity) throws DataAccessException;
	
	/**
	 * 删除一个对象
	 *
	 * @param entity
	 * 			要删除的对象
	 * @return
	 * 			是否删除成功
	 * @throws DataAccessException
	 */
	public boolean delete(Object entity) throws DataAccessException;
	
	
	/**
	 * load加载一个对象
	 * 
	 * @param <T>
	 * 			类型信息T
	 * @param entityName
	 * 			要加载对象的完全限定名
	 * @param id
	 * 			要加载对象的id
	 * @return
	 * 			T 类型的对象
	 * @throws DataAccessException
	 * 			如果加载对象的id不存在或者entityName为null
	 */
	public <T> T load(String entityName , Serializable id) throws DataAccessException;
	
	/**
	 * load加载一个对象
	 * 
	 * @param clazz
	 * 			要加载对象的Class名
	 * @param id
	 * 			要加载对象的id
	 * @return
	 * 			T 类型的对象
	 * @throws DataAccessException
	 * 			如果加载对象的id不存在或者entityName为null
	 */
	public <T> T load(Class<T> clazz , Serializable id);
	
	/**
     * 从数据库中加载对象, 放入obj中, 如果缓存中存在数据, 则从缓存中获取, 否则使用GET loadType 从数据库中加载对象
     * @param entity
     * 		一个瞬时对象
     * @param id
     * 		要加载对象的id
     * @throws DataAccessException
     * 		如果对象没有找到, 或者entity为null
     */
    public void load(Object entity, Serializable id)throws DataAccessException;
	
    /**
     * 使用指定模式从数据库load对象
     * @param <T>
     * 		类型信息T
     * @param entityName
     * 		要加载对象的完全限定名或者名字
     * @param id
     * 		要加载对象的id
     * @param lockMode
     * 		Hibernate锁模式
     * @return
     * 		T 类型的对象
     * @throws DataAccessException
     */
    public <T> T load(String entityName, Serializable id, LockMode lockMode)throws DataAccessException;
    
    /**
     * 使用指定模式从数据库load对象
     * @param <T>
     * @param clazz
     * @param id
     * @param lockMode
     * @return
     * @throws DataAccessException
     */
    public <T> T load(Class<T> clazz ,Serializable id , LockMode lockMode) throws DataAccessException;

    /**
     * 使用get方法加载对象
     * 
     * @param <T>
     * 			类型信息 T
     * @param entityName
     * 			要加载的类名
     * @param id
     * 			要加载的id
     * @return
     * 			如果未找到, 则返回null.
     * @throws DataAccessException
     */
    public <T> T get(String entityName , Serializable id) throws DataAccessException;
    
    /**
     * 使用get方法加载对象
     * 
     * @param <T>
     * 			类型信息 T
     * @param clazz
     * 			要加载类的Class名
     * @param id
     * 			要加载的id
     * @return
     * 			如果未找到, 则返回null.
     * @throws DataAccessException
     */
    public <T> T get(Class<T> clazz , Serializable id) throws DataAccessException;
    
    /**
     * 使用get方法加载对象
     * 
     * @param <T>
     * 			类型信息 T
     * @param entityName
     * 			要加载的类名
     * @param id
     * 			要加载对象的id
     * @param lockMode
     * 			Hibernate锁模式
     * @return
     * 			如果未找到, 则返回null.
     * @throws DataAccessException
     */
    public <T> T get(String entityName ,Serializable id , LockMode lockMode) throws DataAccessException;

    /**
     * 使用get方法加载对象
     * 
     * @param <T>
     * 			类型信息 T
     * @param clazz
     * 			要加载的类的对象
     * @param id
     * 			要加载对象的id
     * @param lockMode
     * 			Hibernate锁模式
     * @return
     * 			如果未找到, 则返回null.
     * @throws DataAccessException
     */
    public <T> T get(Class<T> clazz ,Serializable id , LockMode lockMode) throws DataAccessException;
    
    /**
     * 使用HQL从数据库加载对象
     * 
     * @param <T>
     * 
     * @param HQL
     * 			HQL语句, HQL语句需要使用命名参数的形式
     * @param valueMap
     * 			一个Map, key为命名参数
     * @return
     * @throws DataAccessException
     */
    public <T> T get(String HQL ,Map<String , Object> valueMap) throws DataAccessException;
    
    /**
     * 使用HQL从数据库加载对象, 并缓存
     * 
     * @param <T>
     * 			
     * @param HQL
     * 			HQL语句, HQL语句需要使用命名参数的形式
     * @param valueMap
     * 			一个Map, key为命名参数
     * @param cacheName
     * 			缓存的名字
     * @return
     * @throws DataAccessException
     */
    public <T> T get(String HQL ,Map<String , Object> valueMap , String cacheName) throws DataAccessException;
    
    /**
     * 使用HQL从数据库查找数据, 支持分页查询
     * 
     * @param <T>
     * 			返回数据的类型
     * @param HQL
     * 			HQL语句, HQL语句需要使用命名参数的形式
     * @param valueMap
     * 			一个Map, key为命名参数
     * @param firstResult
     * 			开始行数
     * @param maxResult
     * 			最大行数
     * @return
     * @throws DataAccessException
     */
    public <T> List<T> find(String HQL ,Map<String , Object> valueMap , int firstResult , int maxResult) throws DataAccessException;
    
    /**
     * 根据条件查找对象 
     * @param <T>
     * @param HQL
     * 			HQL语句, HQL语句需要使用命名参数的形式
     * @param valueMap
     * 			一个Map, key为命名参数
     * @return
     * @throws DataAccessException
     */
    public <T> List<T> find(String HQL , Map<String , Object> valueMap) throws DataAccessException;
    
    /**
     * 根据条件查找对象,并是否缓存 
     * @param <T>
     * @param HQL
     * 			HQL语句, HQL语句需要使用命名参数的形式
     * @param valueMap
     * 			一个Map, key为命名参数
     * @param cacheName
     * 			如果不指定缓存名称, 则表示不缓存
     * @return
     * @throws DataAccessException
     */
    public <T> List<T> find(String HQL , Map<String , Object> valueMap , String cacheName) throws DataAccessException;
    
    /**
     * 查找全部
     * 
     * @param HQL
     * 			HQL语句, HQL语句需要使用命名参数的形式
     * @param valueMap
     * 			一个Map, key为命名参数
     * @return
     * @throws DataAccessException
     */
    public List findAll(String HQL , Map<String , Object> valueMap) throws DataAccessException;
    
    /**
     * 使用HQL更新或者删除数据
     * 
     * @param HQL
     * 			HQL语句
     * @param valueMap
     * 			存放值的Map
     * @return
     * 			更新或者删除后的数量
     * @throws DataAccessException
     */
    public Integer update(String HQL , Map<String , Object> valueMap) throws DataAccessException;

    /**
     * 使用HQL删除数据
     * @param HQL
     * 			HQL语句
     * @param valueMap
     * 			存放值的Map
     * @return
     * 			删除后的数量
     * @throws DataAccessException
     */
    public Integer delete(String HQL , Map<String , Object> valueMap) throws DataAccessException;
    
    /**
     * 使用HQL 批量更新数据
     * 
     * @param HQL
     * 			HQL语句
     * @param valueMap
     * 			存放值的Map
     * @return
     * 			更新或者删除后的数量
     * @throws DataAccessException
     */
    public Integer batchUpdate(String HQL , Map<String , Object> valueMap) throws DataAccessException;
    
    /**
     * 批量删除
     * @param HQL
     * 			HQL语句
     * @param valueMap
     * 			存放值的Map
     * @return
     * 			删除后的数量
     * @throws DataAccessException
     */
    public Integer batchDelete(String HQL , Map<String , Object> valueMap) throws DataAccessException;
   
    /**
     * 使用namedQuery 执行批量更新
     * @param namedQuery
     * 			HQL语句名称
     * @param values
     * 			值列表
     * @return
     * @throws DataAccessException
     */
    public Integer batchUpdateByNamedQuery(String namedQuery, Object ... values)throws DataAccessException;
    
    /**
     * 使用namedQuery 执行批量删除
     * @param namedQuery
     * @param values
     * @return
     * @throws DataAccessException
     */
    public Integer batchDeleteByNamedQuery(String namedQuery, Object ... values)throws DataAccessException;
    
    /**
     * 统计数据库记录数
     * 
     * @param HQL
     * @param valueMap
     * @return
     * @throws DataAccessException
     */
    public Long count(String HQL , Map<String , Object> valueMap) throws DataAccessException;
    
    /**
     * 使用namedQuery查询单个对象
     * 
     * @param <T>
     * @param namedQuery
     * @param values
     * @return
     * @throws DataAccessException
     */
    public <T> T getByNamedQuery (String namedQuery , Object ... values) throws DataAccessException;
    
    /**
     * 使用namedQuery查询单个对象
     * 
     * @param <T>
     * @param namedQuery
     * @param values
     * @param cacheName
     * @return
     * @throws DataAccessException
     */
    public <T> T getByNamedQuery (String namedQuery , String cacheName , Object ... values) throws DataAccessException;
    
    /**
     * 使用namedQuery 执行更新...
     * 
     * @param namedQuery
     * 			HQL语句名称
     * @param values
     * 			值列表
     * @return
     * @throws DataAccessException
     */
    public Integer updateByNamedQuery (String namedQuery , Object ... values) throws DataAccessException;
    
    /**
     * 使用namedQuery 执行删除...
     * 
     * @param namedQuery
     * 			HQL语句名称
     * @param values
     * 			值列表
     * @return
     * @throws DataAccessException
     */
    public Integer deleteByNamedQuery (String namedQuery , Object ... values) throws DataAccessException;

    /**
     * 使用namedQuery查询全部数据
     * @param <T>
     * @param namedQuery
     * @param values
     * @return
     * @throws DataAccessException
     */
    public <T> List<T> findAllByNamedQuery(String namedQuery, Object ... values)throws DataAccessException;
    
    /**
     * 使用namedQuery查询全部数据, 并缓存
     * @param <T>
     * @param namedQuery
     * @param cacheName
     * @param values
     * @return
     * @throws DataAccessException
     */
    public <T> List<T> findAllByNamedQuery(String namedQuery, String cacheName, Object ... values)throws DataAccessException;
    
    /**
     * 使用namedQuery查询全部数据, 并缓存(没有参数列表)
     * @param <T>
     * @param namedQuery
     * @param cahceName
     * @return
     * @throws DataAccessException
     */
    public <T> List<T> findAllByNamedQuery(String namedQuery, String cahceName)throws DataAccessException;

    /**
     * 使用namedQuery查询全部数据, 缓存, 并分页
     * @param <T>
     * @param namedQuery
     * @param cacheName
     * @param beginResult
     * @param maxResult
     * @param values
     * @return
     * @throws DataAccessException
     */
    public <T> List<T> findByNamedQuery(String namedQuery, String cacheName, int beginResult, int maxResult, Object ... values)throws DataAccessException;
    
    /**
     * 使用namedQuery查询全部数据, 分页查询
     * @param <T>
     * @param namedQuery
     * @param beginResult
     * @param maxResult
     * @param values
     * @return
     * @throws DataAccessException
     */
    public <T> List<T> findByNamedQuery(String namedQuery, int beginResult, int maxResult, Object ... values)throws DataAccessException;
    
    /**
     * 统计方法
     * @param namedQuery
     * @param values
     * @return
     */
    public Long countByNamedQuery(String namedQuery, Object ... values);
    
    //通过sql语句查询记录条数；
    public int getListCountBySql(String sql);
	//通过sql语句查询记录；
	public List getListBySql(String sql, int currentPage, int pageNums);
	
	
	public List< Map< String, Object >> queryList( String sql, int beginSize, int pageSize, Map< String, Object  > valueMap );
	
	public int countBySQL( String sql, Map< String, Object > valueMap );
	
	public Map< String, Object > queryForMap( String sql, Map< String, Object > valueMap );
	
	public int save ( String tableName, Map < String, Object > insertData ) ;
	
	public int update( String tableName, Map<String, Object > updateData, Map< String, Object > whereData );
	
	public int deleteBySql( String tableName, Map< String, Object > whereData );
	
	public List< Map< String, Object >> queryForListByAll( String sql, Map< String, Object > valueMap );
	
	public int save( String tableName, Map< String, Object > insertData, boolean returnId );
	
	public int saveOrUpdateBatch( List< String > sqls );
	
	public Map< String, Object > getData( String sql );
	
	public List< Map< String, Object >> queryList( String sql, int beginSize, int pageSize, Map< String, Object> valueMap, Map< String, Type > aliasMap );
	
	public int saveOreplace( String tableName, Map< String, Object > replaceData );
}
